<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Funqy Google Cloud Functions</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/funqy-gcp-functions" />
  <meta property="og:title" content="Quarkus - Funqy Google Cloud Functions" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/funqy-gcp-functions">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Funqy Google Cloud Functions</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#login-to-google-cloud">Login to Google Cloud</a></li>
<li><a href="#the-code">The Code</a></li>
<li><a href="#choose">Choose Your Function</a></li>
<li><a href="#build-and-deploy">Build and Deploy</a></li>
<li><a href="#create-the-function">Create the function</a></li>
<li><a href="#build-and-deploy-to-google-cloud">Build and Deploy to Google Cloud</a>
<ul class="sectlevel2">
<li><a href="#background-functions-pubsub">Background Functions - PubSub</a></li>
<li><a href="#background-functions-cloud-storage">Background Functions - Cloud Storage</a></li>
</ul>
</li>
<li><a href="#testing-locally">Testing locally</a>
<ul class="sectlevel2">
<li><a href="#background-functions-pubsub-2">Background Functions - PubSub</a></li>
<li><a href="#background-functions-cloud-storage-2">Background Functions - Cloud Storage</a></li>
</ul>
</li>
<li><a href="#deploying-http-functions-via-funqy">Deploying HTTP Functions via Funqy</a></li>
<li><a href="#whats-next">What&#8217;s next?</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>The guide walks through quickstart code to show you how you can deploy Funqy functions to Google Cloud Functions.</p>
</div>
<div class="paragraph">
<p>As the Google Cloud Function Java engine is a new Beta feature of Google Cloud, this extension is flagged as experimental.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>This technology is considered experimental.</p>
</div>
<div class="paragraph">
<p>In <em>experimental</em> mode, early feedback is requested to mature the idea.
There is no guarantee of stability nor long term presence in the platform until the solution matures.
Feedback is welcome on our <a href="https://groups.google.com/d/forum/quarkus-dev">mailing list</a> or as issues in our <a href="https://github.com/quarkusio/quarkus/issues">GitHub issue tracker</a>.</p>
</div>
<div class="paragraph">
<p>For a full list of possible extension statuses, check our <a href="https://quarkus.io/faq/#extension-status">FAQ entry</a>.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="prerequisites"><a class="anchor" href="#prerequisites"></a>Prerequisites</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To complete this guide, you need:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>less than 30 minutes</p>
</li>
<li>
<p>JDK 11 (Google Cloud Functions requires JDK 11)</p>
</li>
<li>
<p>Apache Maven 3.6.2+</p>
</li>
<li>
<p><a href="https://cloud.google.com/">A Google Cloud Account</a>.  Free accounts work.</p>
</li>
<li>
<p><a href="https://cloud.google.com/sdk">Cloud SDK CLI Installed</a></p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="login-to-google-cloud"><a class="anchor" href="#login-to-google-cloud"></a>Login to Google Cloud</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Login to Google Cloud is necessary for deploying the application and it can be done as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud auth login</code></pre>
</div>
</div>
<div class="paragraph">
<p>At the time of this writing, Cloud Functions are still in beta so make sure to install the <code>beta</code> command group.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud components install beta</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-code"><a class="anchor" href="#the-code"></a>The Code</h2>
<div class="sectionbody">
<div class="paragraph">
<p>There is nothing special about the code and more importantly nothing Google Cloud specific.  Funqy functions can be deployed to many different
environments and Google Cloud Functions is one of them.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="choose"><a class="anchor" href="#choose"></a>Choose Your Function</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Only one Funqy function can be exported per Google Cloud Functions deployment.  If you only have one method
annotated with <code>@Funq</code> in your project, then there is no worries.  If you have multiple functions defined
within your project, then you will need to choose the function within your Quarkus <code>application.properties</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">quarkus.funqy.export=greet</code></pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively, you can set the <code>QUARKUS_FUNQY_EXPORT</code> environment variable when you create the Google Cloud Function using the <code>gcloud</code> cli.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="build-and-deploy"><a class="anchor" href="#build-and-deploy"></a>Build and Deploy</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Build the project using maven.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw clean package</code></pre>
</div>
</div>
<div class="paragraph">
<p>This will compile and package your code.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="create-the-function"><a class="anchor" href="#create-the-function"></a>Create the function</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this example, we will create two background functions. Background functions allow to
react to Google Cloud events like PubSub messages, Cloud Storage events, Firestore events, &#8230;&#8203;</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">import javax.inject.Inject;

import io.quarkus.funqy.Funq;
import io.quarkus.funqy.gcp.functions.event.PubsubMessage;
import io.quarkus.funqy.gcp.functions.event.StorageEvent;

public class GreetingFunctions {

    @Inject
    GreetingService service;

    @Funq <i class="conum" data-value="1"></i><b>(1)</b>
    public void helloPubSubWorld(PubsubMessage pubSubEvent) {
        String message = service.hello("world");
        System.out.println(pubSubEvent.messageId + " - " + message);
    }

    @Funq <i class="conum" data-value="2"></i><b>(2)</b>
    public void helloGCSWorld(StorageEvent storageEvent) {
        String message = service.hello("world");
        System.out.println(storageEvent.name + " - " + message);
    }

}</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Function return type can also be Mutiny reactive types.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>This is a background function that takes as parameter a <code>io.quarkus.funqy.gcp.functions.event.PubsubMessage</code>,
this is a convenient class to deserialize a PubSub message.</p>
</li>
<li>
<p>This is a background function that takes as parameter a <code>io.quarkus.funqy.gcp.functions.event.StorageEvent</code>,
this is a convenient class to deserialize a Google Storage event.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
we provide convenience class to deserialize common Google Cloud event inside the <code>io.quarkus.funqy.gcp.functions.event</code> package.
They are not mandatory to use, you can use any object you want.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>As our project contains multiple function, we need to specify which function needs to be deployed via the following property inside our <code>application.properties</code> :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="property" class="language-property hljs">quarkus.funqy.export=helloHttpWorld</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="build-and-deploy-to-google-cloud"><a class="anchor" href="#build-and-deploy-to-google-cloud"></a>Build and Deploy to Google Cloud</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To build your application, you can package your application via <code>mvn clean package</code>.
You will have a single JAR inside the <code>target/deployment</code> repository that contains your classes and all your dependencies in it.</p>
</div>
<div class="paragraph">
<p>Then you will be able to use <code>gcloud</code> to deploy your function to Google Cloud, the <code>gcloud</code> command will be different depending from which event you want to be triggered.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
<div class="paragraph">
<p>The first time you launch the <code>gcloud beta functions deploy</code>, you can have the following error message:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">ERROR: (gcloud.beta.functions.deploy) OperationError: code=7, message=Build Failed: Cloud Build has not been used in project &lt;project_name&gt; before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview?project=&lt;my-project&gt; then retry.</code></pre>
</div>
</div>
<div class="paragraph">
<p>This means that Cloud Build is not activated yet. To overcome this error, open the URL shown in the error, follow the instructions and then wait a few minutes before retrying the command.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="background-functions-pubsub"><a class="anchor" href="#background-functions-pubsub"></a>Background Functions - PubSub</h3>
<div class="paragraph">
<p>Use this command to deploy to Google Cloud Functions:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud beta functions deploy quarkus-example-funky-pubsub \
  --entry-point=io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction \
  --runtime=java11 --trigger-resource hello_topic --trigger-event google.pubsub.topic.publish \
  --source=target/deployment</code></pre>
</div>
</div>
<div class="paragraph">
<p>The entry point always needs to be <code>io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code> as it will be this class
that will bootstrap Quarkus.</p>
</div>
<div class="paragraph">
<p>The <code>--trigger-resource</code> option defines the name of the PubSub topic, and the <code>--trigger-event google.pubsub.topic.publish</code> option
define that this function will be triggered by all message publication inside the topic.</p>
</div>
<div class="paragraph">
<p>To trigger an event to this function, you can use the <code>gcloud functions call</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud functions call quarkus-example-funky-pubsub --data '{"data":"Hello, Pub/Sub"}'</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>--data '{"data":"Hello, Pub/Sub"}'</code> option allow to specify the message to be send to PubSub.</p>
</div>
</div>
<div class="sect2">
<h3 id="background-functions-cloud-storage"><a class="anchor" href="#background-functions-cloud-storage"></a>Background Functions - Cloud Storage</h3>
<div class="paragraph">
<p>Before deploying your function, you need to create a bucket.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gsutil mb gs://quarkus-hello</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then, use this command to deploy to Google Cloud Functions:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud beta functions deploy quarkus-example-funky-storage \
  --entry-point=io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction \
  --runtime=java11 --trigger-resource quarkus-hello --trigger-event google.storage.object.finalize \
  --source=target/deployment</code></pre>
</div>
</div>
<div class="paragraph">
<p>The entry point always needs to be <code>io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code> as it will be this class
that will bootstrap Quarkus.</p>
</div>
<div class="paragraph">
<p>The <code>--trigger-resource</code> option defines the name of the Cloud Storage bucket, and the <code>--trigger-event google.storage.object.finalize</code> option
define that this function will be triggered by all new file inside this bucket.</p>
</div>
<div class="paragraph">
<p>To trigger an event to this function, you can use the <code>gcloud functions call</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">gcloud functions call quarkus-example-funky-pubsub --data '{"name":"test.txt"}'</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>--data '{"name":"test.txt"}'</code> option allow to specify a fake file name, a fake Cloud Storage event will be created for this name.</p>
</div>
<div class="paragraph">
<p>You can also simply add a file to Cloud Storage using the command line of the web console.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="testing-locally"><a class="anchor" href="#testing-locally"></a>Testing locally</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The easiest way to locally test your function is using the Cloud Function invoker JAR.</p>
</div>
<div class="paragraph">
<p>You can download it via Maven using the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">mvn dependency:copy \
  -Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.0.0-beta1' \
  -DoutputDirectory=.</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then you can use it to launch your function locally, again, the command depends on the type of function and the type of events.</p>
</div>
<div class="sect2">
<h3 id="background-functions-pubsub-2"><a class="anchor" href="#background-functions-pubsub-2"></a>Background Functions - PubSub</h3>
<div class="paragraph">
<p>For background functions, you launch the invoker with a target class of <code>io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">java -jar java-function-invoker-1.0.0-beta1.jar \
  --classpath target/funqy-google-cloud-functions-1.0-SNAPSHOT-runner.jar \
  --target io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then you can call your background function via an HTTP call with a payload containing the event:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">curl localhost:8080 -d '{"data":{"data":"hello"}}'</code></pre>
</div>
</div>
<div class="paragraph">
<p>This will call your PubSub background function with a PubSubMessage <code>{"data":"hello"}</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="background-functions-cloud-storage-2"><a class="anchor" href="#background-functions-cloud-storage-2"></a>Background Functions - Cloud Storage</h3>
<div class="paragraph">
<p>For background functions, you launch the invoker with a target class of <code>io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">java -jar java-function-invoker-1.0.0-beta1.jar \
  --classpath target/funqy-google-cloud-functions-1.0-SNAPSHOT-runner.jar \
  --target io.quarkus.funqy.gcp.functions.FunqyBackgroundFunction</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then you can call your background function via an HTTP call with a payload containing the event:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">curl localhost:8080 -d '{"data":{"name":"text"}}'</code></pre>
</div>
</div>
<div class="paragraph">
<p>This will call your PubSub background function with a Cloud Storage event <code>{"name":"file.txt"}</code>, so an event on the <code>file.txt</code> file.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="deploying-http-functions-via-funqy"><a class="anchor" href="#deploying-http-functions-via-funqy"></a>Deploying HTTP Functions via Funqy</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can use <a href="funqy-http">Funqy HTTP</a> on Google Cloud Functions.
This allows you to invoke on multiple Funqy functions using HTTP deployed as one Google Cloud Function.</p>
</div>
<div class="paragraph">
<p>For this you need to include both <code>quarkus-funqy-http</code> and <code>quarkus-google-cloud-functions</code> extension.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="whats-next"><a class="anchor" href="#whats-next"></a>What&#8217;s next?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you are looking for JAX-RS, Servlet or Vert.x support for Google Cloud Functions, we have it thanks to our <a href="gcp-functions-http">Google Cloud Functions HTTP binding</a>.</p>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
